package com.david.basic.dao;

import java.util.List;
import java.util.Map;

import com.david.basic.model.Pager;

/**
 * 公共Dao处理事件对象，对象中包含了所有基本操作和对sql的操作
 * 
 * @author David
 * @version 2013-4-30
 * @param <T>
 */
public interface IBaseDao<T> {
	/**
	 * 添加对象
	 * 
	 * @param t
	 * @return
	 */
	public T add(T t);

	/**
	 * 更新对象
	 * 
	 * @param t
	 */
	public void update(T t);

	/**
	 * 根据ID删除对象
	 * 
	 * @param t
	 */
	public void delete(int t);

	/**
	 * 根据ID加载对象
	 * 
	 * @param t
	 * @return
	 */
	public T load(int t);
	
	/**
	 * 不分页列表对象
	 * @param hql 查询对象的hql
	 * @param args 查询参数
	 * @return 一组不分页的对象列表
	 */
	public List<T> list(String hql, Object[] args);

	public List<T> list(String hql, Object arg);

	public List<T> list(String hql);
	
	/**
	 * 不带分页的别名和参数的混合查询
	 * @param hql
	 * @param args
	 * @param alias 别名对象
	 * @return
	 */
	public List<T> list(String hql,Object[] args,Map<String, Object> alias);
	
	public List<T> listByAlias(String hql,Map<String, Object> alias);
	
	/**
	 * 分页列表对象
	 * @param hql 查询对象的hql
	 * @param args 查询参数
	 * @return 一组不分页的对象列表
	 */
	public Pager<T> find(String hql, Object[] args);

	public Pager<T> find(String hql, Object arg);

	public Pager<T> find(String hql);
	
	/**
	 * 分页的别名和参数的混合查询
	 * @param hql
	 * @param args
	 * @param alias 别名对象
	 * @return
	 */
	public Pager<T> find(String hql,Object[] args,Map<String, Object> alias);
	
	public Pager<T> findByAlias(String hql,Map<String, Object> alias);
	
	/**
	 * 根据HQL查询一组对象
	 * @param hql
	 * @param args
	 * @return
	 */
	public Object queryObjcet(String hql,Object[] args);
	public Object queryObjcet(String hql,Object arg);
	public Object queryObjcet(String hql);
	public Object queryObject(String hql,Object[] args,Map<String, Object> alias);
	public Object queryObjectByAlias(String hql,Map<String, Object> alias);
	
	/**
	 * 根据HQL更新一组对象
	 * @param hql
	 * @param args
	 */
	public void updateByHql(String hql,Object[] args);
	public void updateByHql(String hql,Object arg);
	public void updateByHql(String hql);
	
	/**
	 * 不带分页：根据SQL查询对象，不包含关联对象
	 * @param sql 查询SQL的语句
	 * @param args 查询条件 
	 * @param clz 查询的实体对象
	 * @param isEntity 查询对象是否是一个hibernate所管理的实体，如果不是需要使用setResultTransform查询
	 * @return 一组对象
	 */
	public <N extends Object>List<N> listBySql(String sql,Object[] args,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listBySql(String sql,Object arg,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listBySql(String sql,Class<?> clz,boolean hasEntity);
	
	public <N extends Object>List<N> listBySql(String sql,Object[] args,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	public <N extends Object>List<N> listByAliasSql(String sql,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	
	/**
	 * 带分页：根据SQL查询对象，不包含关联对象
	 * @param sql 查询SQL的语句
	 * @param args 查询条件 
	 * @param clz 查询的实体对象
	 * @param isEntity 查询对象是否是一个hibernate所管理的实体，如果不是需要使用setResultTransform查询
	 * @return 一组对象
	 */
	public <N extends Object>Pager<N> findBySql(String sql,Object[] args,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findBySql(String sql,Object arg,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findBySql(String sql,Class<?> clz,boolean hasEntity);
	
	public <N extends Object>Pager<N> findBySql(String sql,Object[] args,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	public <N extends Object>Pager<N> findByAliasSql(String sql,Map<String,Object> alias,Class<?> clz,boolean hasEntity);
	
}
